#ifndef _LOCOS_H_
#define _LOCOS_H_

#ifdef  __cplusplus   //如果没有定义__cplusplus   
#define NULL    0      //则定义NULL 为 0
#else                  //否则定义NULL为((void *)0)
//#define NULL    ((void *)0)
#endif

#define MAXTASKCNT   50
#if MAXTASKCNT<=255
    typedef unsigned char  taskcnt;
    static long triggerTAB=0;
    static long stateTAB  =0;
#else
    typedef int  taskcnt;
    static long long triggerTAB=0;
    static long long stateTAB  =0;
#endif

typedef union {
    unsigned char u8val;
    unsigned int  u32val;
    float         f32val;
    double        d64val;
} EventValue_union;

typedef union {
    unsigned char u8val;
    unsigned int  u32val;
    // unsigned long
} List_union;

typedef enum {
    Disable  = 0,
    Enable   = 1,
} EnableType_enum;

typedef enum {
    stop   = 0,
    running  = 1,
} RunType_enum;

// typedef enum {


// } ErrorType_enum;

typedef enum {
    Private   = 0,
    Global    = 1,
} ShareType_enum;

typedef struct {
    RunType_enum       state;
    EnableType_enum    trigger;
    taskcnt            *senior;
    taskcnt            *junior;  //这两个数组第一个元素代表个数
    //互斥级别设置的有些简单  对于某一事件  但A发生时，   实际也没事  可以在触发函数中做手脚  不应该叫事件 叫功能？
    taskcnt            ID;       //ID分配自1开始，0不分配
    void (*exeFun)(EnableType_enum sta);
    void (*triggerFun)(void);//触发函数中，如果满足触发条件，必须调用执行函数
    EventValue_union   value;
    // unsigned char      flag;
    // unsigned char      reserve;
    // unsigned char      num;
    // EnableType_enum    share;
    // ErrorType_enum     error;
} EventParameter_struct;          //事件参数


typedef struct EventLink{
    EventParameter_struct *event;
    struct EventLink *last;
    struct EventLink *next;
}EventLink_struct;          //事件参数

void LocosListen(void);
char exeDecide(EventParameter_struct *event);
unsigned char RegisterTask(EventParameter_struct **event,void (*exeFun)(EnableType_enum sta),void (*triggerFun)(void),\
                           taskcnt ID,taskcnt *senior,taskcnt *junior);
void LocosInit();
#endif